package info.tanke;

import info.stapel.StapelElement;

public class DoppeltVerkettet implements Cloneable
{
  private ListenElement Kopf, Ende, Aktuell;
  
  public DoppeltVerkettet()
  {
    Kopf=Ende=Aktuell=null;
  }
  
  protected void alleElementeLoeschen()
  {
    Kopf=Ende=Aktuell=null;
  }
  
  protected void zumAnfang()
  {
    Aktuell=Kopf;
  }
  
  protected void zumEnde()
  {
    Aktuell=Ende;
  }
  
  protected Object aktuellesElement()
  {
    if (istLeer())
      return null;
    return Aktuell.Inhalt;
  }
  
  protected Object naechstesElement()
  {
    if (Vorschau()!=null)
      Aktuell=Aktuell.next;
    return Aktuell.Inhalt;
  }
  
  protected Object vorherigesElement()
  {
    if (Zurueckschau()!=null)
      Aktuell=Aktuell.prior;
    return Aktuell.Inhalt;
  }
     
  protected Object Vorschau()
  {
    if (istLeer())
      return null;
    if (Aktuell.next==null)
      return null;
    return Aktuell.next.Inhalt;
  }
  
  protected Object Zurueckschau()
  {
    if (istLeer()) 
      return null;
    if (Aktuell.prior==null)
      return null;
    return Aktuell.prior.Inhalt;
  }
  
  protected void vorneEinfuegen(Object o)
  {
    ListenElement neu=new ListenElement(o,Kopf,null);
    if (istLeer())   // leere Liste
      Kopf=Ende=Aktuell=neu;
    else 
    {
      neu.next=Kopf;
      neu.prior=null;
      Kopf=Aktuell=neu;
    }
  }
  
  protected void einfuegen(Object o)
  {
    if (Kopf==null)    //leere Liste
    {
      vorneEinfuegen(o);
      return;
    }
    ListenElement neu=new ListenElement(o,Aktuell.next,Aktuell);
    if (Aktuell==Ende)    //hinten an der Liste angef�gt
    {
      Ende=neu;
      Aktuell.next=neu;
    }
    else
    {
      ListenElement nachfolger=Aktuell.next;
      Aktuell.next=neu;
      nachfolger.prior=neu;
    }
    Aktuell=neu;
  }
   
  protected Object aktuellesEntfernen()
  {
    if (istLeer())      //leere Liste
      return null;
    ListenElement entferne=Aktuell, temp=Kopf;
    if (entferne==Kopf)  //erstes Element entfernen
    {
      Kopf=Kopf.next;
      if (Kopf!=null)
        Kopf.prior=null;
      Aktuell=Kopf;
    }
    else
    {
      temp=entferne.prior;
      //V�rg�nger von entferne in temp
      temp.next=Aktuell.next;
      Aktuell=Aktuell.next;
      if (Aktuell!=null)
        Aktuell.prior=temp;
      Aktuell=temp;
    }
    return entferne.Inhalt;
  }
  
  protected boolean istLeer()
  {
    return (Kopf==null);
  }
  
  protected int gibLänge()
  {
    int Länge=0;
    ListenElement temp=Kopf;
    
    if (istLeer())
      return 0;
    while (temp!=null)
    {
      Länge++;
      temp=temp.next;
    }
    return Länge;
  }
  
     protected Object clone() {
      Object theClone = null;
      try {
        theClone = super.clone();
      }
      catch(CloneNotSupportedException e) {
      }
      return theClone;
    }
    

    protected void goTo(int test_position) {
        this.zumAnfang();
        for(int i=0;i<test_position;i++){
            this.naechstesElement();
        }
    }
}